2043. Simple Bank System
- 題目描述
- 解答
Description
You have been tasked with writing a program for a popular bank that will automate all its incoming transactions (transfer, deposit, and withdraw). The bank has n accounts numbered from 1 to n. The initial balance of each account is stored in a 0-indexed integer array balance, with the (i + 1)th account having an initial balance of balance[i].
Execute all the valid transactions. A transaction is valid if:
- The given account number(s) are between 1 and n, and
- The amount of money withdrawn or transferred from is less than or equal to the balance of the account.
Implement the Bank class:
Bank(long[] balance)Initializes the object with the 0-indexed integer array balance.boolean transfer(int account1, int account2, long money)Transfers money dollars from the account numbered account1 to the account numbered account2. Return true if the transaction was successful, false otherwise.boolean deposit(int account, long money)Deposit money dollars into the account numbered account. Return true if the transaction was successful, false otherwise.boolean withdraw(int account, long money)Withdraw money dollars from the account numbered account. Return true if the transaction was successful, false otherwise.
Example 1:
Input: ["Bank", "withdraw", "transfer", "deposit", "transfer", "withdraw"]
[[[10, 100, 20, 50, 30]], [3, 10], [5, 1, 20], [5, 20], [3, 4, 15], [10, 50]]
Output: [null, true, true, true, false, false]
Explanation: Bank bank = new Bank([10, 100, 20, 50, 30]);
bank.withdraw(3, 10);// return true, account 3 has a balance of 10.
// Account 3 has 10 = 30, so it is valid to transfer 30 - 10, and account 1 has 20 = 20 to account 5.
// Account 5 has 20 = 10,
// so it is invalid to transfer $15 from it.
bank.withdraw(10, 50); // return false, it is invalid because account 10 does not exist.
Constraints:
n == balance.length- 1 n, account, account1, account2
- 0 balance[i], money
- At most calls will be made to each function transfer, deposit, withdraw.
Solution
- JavaScript
- TypeScript
/**
* @param {number[]} balance
*/
var Bank = function (balance) {
this.balance = balance;
this.n = balance.length;
};
/**
* @param {number} account1
* @param {number} account2
* @param {number} money
* @return {boolean}
*/
Bank.prototype.transfer = function (account1, account2, money) {
if (account1 > this.n || account2 > this.n) return false;
if (money > this.balance[account1 - 1]) return false;
this.balance[account1 - 1] -= money;
this.balance[account2 - 1] += money;
return true;
};
/**
* @param {number} account
* @param {number} money
* @return {boolean}
*/
Bank.prototype.deposit = function (account, money) {
if (account > this.n) return false;
this.balance[account - 1] += money;
return true;
};
/**
* @param {number} account
* @param {number} money
* @return {boolean}
*/
Bank.prototype.withdraw = function (account, money) {
if (account > this.n) return false;
if (money > this.balance[account - 1]) return false;
this.balance[account - 1] -= money;
return true;
};
/**
* Your Bank object will be instantiated and called as such:
* var obj = new Bank(balance)
* var param_1 = obj.transfer(account1,account2,money)
* var param_2 = obj.deposit(account,money)
* var param_3 = obj.withdraw(account,money)
*/
class Bank {
public balance: number[];
public n: number;
constructor(balance: number[]) {
this.balance = balance;
this.n = balance.length;
}
transfer(account1: number, account2: number, money: number): boolean {
if (account1 > this.n || account2 > this.n) return false;
if (money > this.balance[account1 - 1]) return false;
this.balance[account1 - 1] -= money;
this.balance[account2 - 1] += money;
return true;
}
deposit(account: number, money: number): boolean {
if (account > this.n) return false;
this.balance[account - 1] += money;
return true;
}
withdraw(account: number, money: number): boolean {
if (account > this.n) return false;
if (money > this.balance[account - 1]) return false;
this.balance[account - 1] -= money;
return true;
}
}
/**
* Your Bank object will be instantiated and called as such:
* var obj = new Bank(balance)
* var param_1 = obj.transfer(account1,account2,money)
* var param_2 = obj.deposit(account,money)
* var param_3 = obj.withdraw(account,money)
*/
解題思路
照著題目描述並轉換成程式碼
首先初始化 Bank 物件,包含傳入的 balance 以及 n 代表 balance 的 length
var Bank = function (balance) {
this.balance = balance;
this.n = balance.length;
};
再分別實作轉帳、存款、提款的功能
先是轉帳
Bank.prototype.transfer = function (account1, account2, money) {
if (account1 > this.n || account2 > this.n) return false; // 如果任一帳戶編號 > n ,代表該帳戶不存在,回傳 false
if (money > this.balance[account1 - 1]) return false; // 如果帳戶餘額不夠也是 false
this.balance[account1 - 1] -= money; // 從帳戶 1 轉出 money
this.balance[account2 - 1] += money; // 把 money 轉入帳戶 2
return true;
};
再來存款
Bank.prototype.deposit = function (account, money) {
if (account > this.n) return false; // 如果帳戶編號 > n ,代表該帳戶不存在,回傳 false
this.balance[account - 1] += money; // 把 money 存入該帳戶
return true;
};
最後提款
Bank.prototype.withdraw = function (account, money) {
if (account > this.n) return false; // 如果帳戶編號 > n ,代表該帳戶不存在,回傳 false
if (money > this.balance[account - 1]) return false; // 如果帳戶餘額不夠也是 false
this.balance[account - 1] -= money; // 從帳戶中轉出 money
return true;
};
心得
酷酷物件導向
一開始使用 !this.balance[account - 1],來判斷帳戶是否存在
但這樣子要是帳戶餘額是 0,!0 會變成 true,導致錯誤判斷為帳戶不存在
後來改成使用 if (account > this.n) 解決此問題。
而因為物件導向很適合用來練習 TypeScript
所以也另外寫了 TS 版本的解答。
跟 JS 的邏輯是一樣的,只是變為使用 class 來實作,以及在初始化時候包含 balance 和 n 的型別來避免 IDE 報錯
class Bank {
public balance: number[];
public n: number;
constructor(balance: number[]) {
this.balance = balance;
this.n = balance.length;
}
}